#include <iostream>
#include <string>
#include <cstring>
#include <fstream>
#include <unordered_map>
#include "Log.hpp"
#include "InetAddr.hpp"

using namespace LogModule;

const std::string default_dict_Path = "./dictionary.txt"; // 词典文件路径
const std::string default_sep = ":";                      // 定义分隔符 apple:苹果

class Dict
{
public:
    // 构造函数
    Dict(const std::string &path = default_dict_Path) : _dict_path(path)
    {
    }

    // 文件加载函数
    bool LoadDict()
    {
        // 打开文件
        std::ifstream ifs(_dict_path);
        if (ifs.is_open() == false) // 打开失败
        {
            LOG(LogLevel::FATAL) << "打开词典文件" << _dict_path << "失败";
            return false;
        }

        // 读取文件内容
        std::string line;
        while (std::getline(ifs, line)) // 读取每行
        {
            auto pos = line.find(default_sep); // 找到分隔符
            if (pos == std::string::npos)      // 分隔符不存在
            {
                LOG(LogLevel::WARNING) << "解析 " << line << " 失败, 缺少分隔符" << default_sep;
                continue;
            }

            // apple:苹果
            std::string english = line.substr(0, pos);                   // 获取英文单词
            std::string chinese = line.substr(pos + default_sep.size()); // 获取中文翻译
            if (english.empty() || chinese.empty())                      // 单词或翻译为空
            {
                LOG(LogLevel::WARNING) << "解析" << line << "失败, 单词或翻译为空";
                continue;
            }

            // 加入词典
            _dict.insert(std::make_pair(english, chinese));     // 加入哈希表
            LOG(LogLevel::DEBUG) << "加载 " << line << "成功!"; // 打印成功加载日志信息
        }

        return true; // 加载成功
    }

    // 翻译函数, 输入单词, 输出翻译结果
    std::string Translate(const std::string &word, InetAddr &addr) // 默认参数
    {
        auto item = _dict.find(word); // 查找单词

        // 未找到单词
        if (item == _dict.end())
        {
            // server端打印消息日志, 未查找到单词
            LOG(LogLevel::DEBUG) << "[IP: " << addr.getIp() << " PORT: " << addr.getPort() << "]### "
                             << " 进入翻译模块, 翻译内容: " << word << " -> none";
            return "none";
        }

        // 找到单词
        std:: string ret = item->second; // ret获取翻译结果
        // server端打印消息日志, 成功查找到单词
        LOG(LogLevel::DEBUG) << "[IP: " << addr.getIp() << " PORT: " << addr.getPort() << "]### "
                             << " 进入翻译模块, 翻译内容: " << word << " -> " << ret;

        return ret; // 函数返回翻译结果, 后续传回client端

    }

    // 析构函数
    ~Dict()
    {
    }

private:
    std::string _dict_path;                             // 词典文件路径
    std::unordered_map<std::string, std::string> _dict; // 词典, 哈希表
};